/* Filename: 1-fifo.c
 * Description:
 * Last modified: humble 2020-11-02 22:57
 * $ gcc -Wall -o 1-fifo 1-fifo.c -levent
 */
#include <stdio.h>
#include <stdlib.h>
#include <event.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

static void usage(void)
{
#define USAGE "Usage:\n\
  Helloworld\n"
    printf(USAGE);
}

//当监听的事件满足条件时，会调用该回调函数，在函数内读取数据
void fifo_read(evutil_socket_t fd, short events, void *arg)
{
    char buf[32] = {0};

    int ret = read(fd, buf, sizeof(buf));
    if (-1 == ret) { perror("read()"); exit(1); }

    printf("从管道读取 %s\n", buf);
}

int main(int argc, char **argv)
{
    if(argc != 1){ fprintf(stderr, "argc !=1"); usage(); exit(1); }

    int ret = mkfifo("fifo.tmp", 00700);
    if (-1 == ret) { perror("mkfifo()"); exit(1); }

    int fd = open("fifo.tmp", O_RDONLY);
    if (0 > fd) { perror("open()"); exit(1); }

    //创建事件
    struct event ev;

    //初始化事件集合
    event_init();

    //初始化事件（把fd和ev绑定）
    //EV_PERSIST:发生事件时依然保留关心的事件，不用重新布置关心的事件
    event_set(&ev, fd, EV_READ | EV_PERSIST, fifo_read, NULL);

    //把事件添加到集合中
    event_add(&ev, NULL);

    //开始监听
    event_dispatch(); //死循环监听 如果集合中没有事件可以监听，则返回

    return 0;
}
